package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"os"
)

type StudentInfo map[string]map[string]string

func main() {
	stuinfo := StudentInfo{}
	for {
		fmt.Println("1: 添加学生信息 2: 查询学生信息 3: 保存到文件 4: 从文件加载 q: 退出系统")
		var choice string
		fmt.Scanln(&choice)
		switch choice {
		case "1":
			fmt.Println("开始添加学生信息")
			var name, age, sex, address string
			fmt.Print("请输入学生姓名 年龄 性别 住址: ")
			if _, err := fmt.Scanln(&name, &age, &sex, &address); err != nil {
				fmt.Println("输入错误:", err)
				continue
			}
			if _, exists := stuinfo[name]; exists {
				fmt.Println("该学生已存在，请勿重复添加")
			} else {
				stuinfo[name] = map[string]string{
					"age":     age,
					"sex":     sex,
					"address": address,
				}
				fmt.Println("添加成功")
			}
			fmt.Println(stuinfo)
		case "2":
			fmt.Println("开始查询学生信息,请输入要查询的学生姓名")
			var name string
			fmt.Scanln(&name)
			value, ok := stuinfo[name]
			if ok {
				fmt.Println(value)
			} else {
				fmt.Println("该学生不存在，请先添加")
			}
		case "3":
			if err := saveToFile(stuinfo); err != nil {
				log.Println("保存到文件失败:", err)
			} else {
				fmt.Println("保存成功")
			}
		case "4":
			if loadedStuinfo, err := loadFromFile(); err != nil {
				log.Println("从文件加载失败:", err)
			} else {
				stuinfo = loadedStuinfo
				fmt.Println("加载成功")
			}
		case "q":
			fmt.Println("退出系统")
			return

		default:
			fmt.Println("输入错误，请从1,2,3,4,q选择")
			continue
		}
	}
}
func saveToFile(stuinfo StudentInfo) error {
	jsonData, err := json.Marshal(stuinfo)
	if err != nil {
		return fmt.Errorf("转换格式失败: %w", err)
	}
	file, err := os.OpenFile("test.txt", os.O_WRONLY, 777)
	if err != nil {
		return fmt.Errorf("打开文件失败: %w", err)
	}
	defer file.Close()
	_, err = file.Write(jsonData)
	if err != nil {
		return fmt.Errorf("写入文件失败: %w", err)
	}
	return nil
}
func loadFromFile() (StudentInfo, error) {
	data, err := ioutil.ReadFile("test.txt")
	if err != nil {
		return nil, err
	}
	var stuinfo StudentInfo
	if err := json.Unmarshal(data, &stuinfo); err != nil {
		return nil, err
	}
	return stuinfo, nil
}
